package cn.edu.cdu.health.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @ControllerAdvice: 把当前类声明为全局异常处理器，能拦截控制器controller中的异常
 *                  底层是基于AOP（面向切面）实现的
 *
 * @ExceptionHandler: 表示处理的异常类型，声明在方法上
 *
 * @RestControllerAdvice:聚合@ControllerAdvice和@ResponseBody
 *
 * @Slf4j: lombok提供的注解，用于记录日志在控制台或文件
 */


@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = BizException.class)
    public R handleBizException(BizException e) {

        //为了服务器的安全，不能把异常原因暴露给前端
        // 统一返回话术
        return R.failed(e.getMessage());


    }

    /**
     * 控制器中发生的所有的异常处理方法
     * @param e 发送的异常会自动注入给参数e
     * @return 返回统一的类型R
     */
    @ExceptionHandler(value = Exception.class)
    public R handleException(Exception e) {

        //info: 信息
        // warn: 警告
        //error: 严重的错误
       // log.error(e.toString());
       // log.error(e.getMessage());

        // 获取异常的发生的轨迹
        /*StackTraceElement[] stackTrace = e.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            log.error(stackTraceElement.toString());
        }*/

        // 开发时，还需要把异常暴露在控制台
        e.printStackTrace();


        //为了服务器的安全，不能把异常原因暴露给前端
        // 统一返回话术
        return R.failed("服务器开小差了，请稍后再试");


    }
}
